package zx.lrn.notes.basic_grammer.internal_class;

/**
 * @ClassName: LocalInternalClass
 * @Description: 局部内部类，即创建在方法内部的类，对外部世界隐藏，只能在方法内部访问到。
 * 用以更好的组织方法。
 * @Author: zhaoxuan
 * @Date: 2020/2/29 19:58
 **/
public class LocalInternalClass {
    private String outerFiled = "outer.outerFiled";

    private void test(int times) {
        /**
         * Inner的say方法执行时能得到外围方法参数times的值的过程：
         * 1、编译器注意到Inner类对局部变量times的使用，会自动为Inner生成一个对应的常量属性
         * 2、编译器为Inner类生成一个带参构造，构造器的参数对应于times
         * 3、Inner类在实例化时，将值传递给构造器，从而完成常量属性的赋值，OVER.
         */
        class Inner {
            private void say() {
                for (int n=0; n < times;n++){
                    System.out.println("i'm inner");
                    System.out.println(LocalInternalClass.this.outerFiled);
                }
            }
        }
        Inner inner = new Inner();
        inner.say();
    }

    public static void main(String[] args) {
        LocalInternalClass localInternalClass = new LocalInternalClass();
        localInternalClass.test(3);
    }
}
